#include <sys_head.h>

/*
计算机网络专业术语
    分层：将复杂的网络功能划分为多个层次，如OSI七层和TCP/IP四层模型
    实体：是计算机网络中具有可识别的功能单位，可以是硬件或者是软件
    协议：是计算机网络中通信双方约定的一套规则和标准，规定了如何进行数据的格式化、传输、接受和处理，如TCP、UDP协议
    接口：是分层模型中相邻两层之间的连接点，规定了层与层之间的交互方式和数据传输方式
    服务：是指一层向其上一层提供的功能和能力

OSI七层模型
    应用层    -----> 为应用程序提供网络服务接口，如HTTP，FTP,SMTP等
    表示层    -----> 负责数据的格式转换、加密、解密和压缩
    会话层    -----> 提供端到端的可靠或不可靠传输服务，如TCP和UDP协议
    网络层    -----> 进行数据包的路由选择和转发，使用IP地址进行寻址
    数据链路层-----> 确保同一网络节点之间的帧传输，提供错误检测与纠正
    物理层    -----> 定义硬件传输介质及信号传输方式，如电缆、光纤、无线信号等

TCP/IP五层模型
    应用层    -----> 提供网络服务接口，如HTTP，FTP,SMTP等
    传输层    -----> 负责端到端的通信连接，如TCP和UDP协议
    网络层    -----> 进行数据包的路由选择和转发，使用IP地址进行寻址
    数据链路层-----> 负责相邻节点之间的可靠数据传输，如Ethernet和PPP协议
    物理层    -----> 定义物理介质和信号传输方式，如电缆、光纤、无线信号等

PDU协议数据单元：用于传输的完整数据单元，包含了SDU(实际数据)和(控制信息)
SDU服务数据单元：是上层协议交给下层协议传输的实际数据内容，不包含任何控制信息
PCI协议控制信息：是每一层协议在封装数据时添加的控制信息，确保数据在网络中的正确传输，路由和处理

网络层协议
DHCP协议：动态主机配置协议，是一种用于自动分配 IP 地址及其他网络配置参数（如网关地址和 DNS 服务器）的网络协议，能够简化网络管理
ARP协议：地址解析协议，是用于将 IP 地址解析为 MAC 地址的网络协议，使设备能够在局域网 (LAN) 中通信
ICMP协议：互联网控制消息协议，是一种用于在 IP 网络中传递控制消息和错误报告的协议，用于检测网络状态和诊断网络问题
DNS协议：域名系统协议，是用于 将人类可读的域名（如 www.baidu.com）解析为 IP 地址（如 192.0.2.1）的系统和协议，使得用户能够通过域名访问网络资源

IPv4 地址的格式转换包括
inet_aton() 将IPv4地址从点分十进制字符串格式转换为二进制格式。
inet_addr() 将IPv4地址从点分十进制字符串格式转换为网络字节序的整数。
inet_ntoa() 将IPv4地址从网络字节序的二进制格式转换为点分十进制字符串格式。
IPv4 和 IPv6 都兼容
inet_pton() 将IP地址（IPv4或IPv6）从文本字符串格式转换为二进制格式。
inet_ntop() 将IP地址（IPv4或IPv6）从二进制格式转换为文本字符串格式。

htons：Host to Network Short，表示将主机字节序的短整数转换为网络字节序的短整数。
htonl：Host to Network Long，表示将主机字节序的长整数转换为网络字节序的长整数。
ntohs：Network to Host Short，表示将网络字节序的短整数转换为主机字节序的短整数。
ntohl：Network to Host Long，表示将网络字节序的长整数转换为主机字节序的长整数。

流式套接字（SOCK_STREAM）
数据报套接字（SOCK_DGRAM）
*/

int main(int argc, char const *argv[])
{
    if (3 != argc)
    {
        printf("参数错误:%s ip port\n",argv[0]);
        return -1;
    }
    // 1、创建套接字
    int Sock_fd = socket(AF_INET,SOCK_STREAM,0);
    // ​2、填充服务器网络信息结构体
    struct sockaddr_in Sock_arr;
    Sock_arr.sin_family = AF_INET;
    Sock_arr.sin_port = htons(atoi(argv[2]));
    Sock_arr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t Sock_size = sizeof(Sock_arr);
    // 3​、将套接字与服务器的网络信息结构体绑定
    if(-1 == bind(Sock_fd,(struct sockaddr*)&Sock_arr,Sock_size))
    {
        ERRLOG("bind err");
        return -1;
    }
    // ​4、将套接字设置城 监听状态
    if (-1 == listen(Sock_fd,5))
    {
        ERRLOG("listen err");
        return -1;
    }
    // ​5、阻塞等待客户端连接 accept
    int acc_fd = accept(Sock_fd,NULL,NULL);
    if (-1 == acc_fd)
    {
        ERRLOG("accept err");
        return -1;
    }
    // ​6、数据手法 write read
    // ​7、关闭套接字  close
    close(acc_fd);
    close(Sock_fd);
    // // 3、与服务器建立连接 connect
    // if (-1 == connect(Sock_fd,(struct sockaddr*)&Sock_arr,Sock_size))
    // {
    //     ERRLOG("connect err");
    //     return -1;
    // }
    
    return 0;
}
